home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_300
/
344_01
/
mind.c
< prev
next >
Wrap
Text File
|
1989-06-06
|
7KB
|
238 lines
/* HEADER: (cat #);
TITLE: Mastermind - number guessing game with skill levels;
DATE: 06/08/1989;
DESCRIPTION: "Try to guess a random number of a specified number of digits.
The computer tells you how many digits you have correct, each
time, and how many of them are in the correct position.";
KEYWORDS: mastermind, game.;
SYSTEM: MS-DOS;
FILENAME: MIND.C;
AUTHOR: Eric Horner;
COMPILERS: Turbo C 2.0;
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define BSpace '\x8'
static char rnd_num[8],
rnd_flag[] = {'N','N','N','N','N','N','N','N'},
in_flag[] = {'N','N','N','N','N','N','N','N'},
in_num[8], char_in;
int loops, result_1, result_2, inner,
num_digs, attempts;
char reply, max_dig;
void menu()
{
clrscr();
printf(" ╔═══════════════════════════════════════╗\n");
printf(" ║ PC MASTERMIND ║\n");
printf(" ╟───────────────────────────────────────╢\n");
printf(" ║ Try to guess the number. The computer ║\n");
printf(" ║ will give you hints if you guess well ║\n");
printf(" ║ Press Q to QUIT any time you need to! ║\n");
printf(" ║ Written by Eric Horner Apr 1989 ║\n");
printf(" ╚═══════════════════════════════════════╝\n\n");
printf(" 1: JERK (3 Figure number - 0 to 5)\n\n");
printf(" 2: NOVICE (3 Figure number - 0 to 9)\n\n");
printf(" 3: TRYER (4 Figure number - 0 to 5)\n\n");
printf(" 4: NORMAL (4 Figure number - 0 to 9)\n\n");
printf(" 5: BRAINY (5 Figure number - 0 to 9)\n\n");
printf(" S: SADIST (Set someone a number)\n\n");
printf(" Q: QUITTER\n\n");
printf(" Enter your SKILL LEVEL (1 to 5, S or Q)\n");
do /* until valid character (1 to 7) */
{
reply = getch();
if (((reply <= '0') || (reply > '7'))
&& (reply != 'Q') && (reply != 'q')
&& (reply != 'S') && (reply != 's')) printf("\07");
} while (((reply <= '0') || (reply > '7'))
&& (reply != 'Q') && (reply != 'q')
&& (reply != 'S') && (reply != 's'));
switch (reply)
{
case '1': {
num_digs = 3;
max_dig = '5';
break;
}
case '2': {
num_digs = 3;
max_dig = '9';
break;
}
case '3': {
num_digs = 4;
max_dig = '5';
break;
}
case '4': {
num_digs = 4;
max_dig = '9';
break;
}
case '5': {
num_digs = 5;
max_dig = '9';
break;
}
case 'Q':
case 'q': {
exit(0); /* Quit program */
break;
}
case 'S':
case 's': {
num_digs = 0; /* This means user selected */
max_dig = '9';
break;
}
default : {
break;
}
} /* End of switch */
} /* End of menu() */
main()
{
randomize(); /* set up rnd gen */
do
{
clrscr();
menu(); /* Get players skill level */
clrscr();
if (num_digs == 0)
{
printf("%s\n\n",
"TELL YOUR OPPONENT NOT TO LOOK, THEN ENTER YOUR NUMBER");
/* get user selected number - up to 7 digits */
for (loops = 0; loops < 7 && num_digs == 0; ++loops)
{
do
{
char_in = getche();
if ((char_in == 'Q') || (char_in == 'q')) exit(0);
if (((char_in < '0') || (char_in > '9')) &&
(char_in != BSpace) &&
(char_in != '\r'))
{
printf("\07");
putch(BSpace);
}
if ((char_in == BSpace) && (loops > 0))
--loops;
} while (((char_in < '0') || (char_in > '9'))
&& (char_in != '\r'));
if (char_in != '\r') rnd_num[loops] = char_in;
else num_digs = loops;
if (loops == 6) num_digs = loops + 1;
}
}
else
{
/* get random number (in ASCII) */
for (loops = 0; loops < num_digs; ++loops)
rnd_num[loops] = random(max_dig - 0x30 + 1) + 0x30;
}
clrscr();
printf("ENTER YOUR GUESS NOW (USE BACKSPACE TO CORRECT ERRORS)\n\n");
attempts = 0;
do
{
++attempts; /* Keep score */
result_1 = 0;
result_2 = 0;
for (loops = 0; loops < 8; ++loops)
{
in_flag[loops] = 'N';
rnd_flag[loops] = 'N';
}
/* Get next guess */
for (loops = 0; loops < num_digs; ++loops)
{
do
{
char_in = getche();
if ((char_in == 'Q') || (char_in == 'q')) exit(0);
if (((char_in < '0') || (char_in > max_dig)) &&
(char_in != BSpace))
{
printf("\07");
putch(BSpace);
}
if ((char_in == BSpace) && (loops > 0))
--loops;
} while ((char_in < '0') || (char_in > max_dig));
in_num[loops] = char_in;
}
/* How many right and in the right place? */
for (loops = 0; loops < num_digs; ++loops)
{
if (rnd_num[loops] == in_num[loops])
{
++result_1; /* right number, right place */
rnd_flag[loops] = 'Y';
in_flag[loops] = 'Y';
}
}
/* How many right but in the wrong place? */
for (loops = 0; loops < num_digs; ++loops)
{
for (inner = 0; inner < num_digs; ++inner)
{
if ((rnd_num[loops] == in_num[inner])
&& (rnd_flag[loops] != 'Y')
&& (in_flag[inner] != 'Y'))
{
rnd_flag[loops] = 'Y';
in_flag[inner] = 'Y';
++result_2; /* right number, wrong place */
}
}
}
printf("\t%s%d\t%s%d\n",
"Right number, right place : ", result_1,
"Right number, wrong place : ", result_2);
} while (result_1 < num_digs);
if (attempts == 1)
printf("\07\nLUCKY GUESS!!!");
else printf("\07\n%s%d%s",
"WELL DONE! You got it all right in ",
attempts, " attempts!");
printf("\n\nPress <Q> to quit, any other key to play again!");
char_in = getche();
} while ((char_in != 'Q') && (char_in != 'q'));
}